/**
 * @author：anlzou
 * @Date：Created in8:38 2021/4/19
 * @Github：https://github.com/anlzou
 * @Description：
 */
package com.anlzou.utlis;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtilsDataSource {

    static DataSource dataSource; //连接池接口

    static {
        try {
            //获取一个properties的文件
            InputStream is = DBUtilsDataSource.class.getClassLoader().getResourceAsStream("druid.properties");
            Properties properties = new Properties();
            properties.load(is);
            /*
                需要一个接口的实现者, 来给这个接口赋值;
                思考一下,为什么我们还需要一个properties文件???
                我们连接数据库的驱动,连接串,用户名,密码,是我们给连接池,还是连接池自己就有了
                连接池根据这个配置文件来连接我们的数据库;
             */
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用连接池的这个技术,来获取连接;
     * 通过连接池来得到一个连接
     * @return
     */
    public static Connection getConnection() {
        try {
            //这里是使用连接池的方式来获取连接
            return dataSource.getConnection(); //从连接池里面获取一个连接
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 提供静态方法,关闭我们的结果集; 关闭我们的 ps对象; 关闭我们的连接对象;
    public static void close(Connection con, PreparedStatement ps, ResultSet rs) {
        closeResultSet(rs);         // 关闭结果集
        closePreparedStatement(ps); // 关闭操作数据库的对象
        closeConnection(con);       // 关闭连接
    }

    private static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    private static void closePreparedStatement(PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    private static void closeConnection(Connection con) {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
